package cn.itcast.zt;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;

import java.util.Collections;
import java.util.List;
import java.util.Set;

/**
 * 对象判等测试
 * create by zhangtian105 on 2021/3/18
 */
public class ObjectEqualTest {
    public static void main(String[] args) {
        // 1、比较值的内容，除了基本类型只能使用 == 外，其他类型都需要使用 equals
        Person p1 = Person.builder().id("1001").name("zhangsan").build() ;
        Person p2 = Person.builder().id("1001").name("zhangqi").build() ;

        // 重新了equal方法的判断逻辑，如果是id相等，则为true
        System.out.println("p1.equals(p2) >>: " + p1.equals(p2));

        // 重写了hashcode，这里就只有一个对象
        Set<Person> personSet = CollUtil.newHashSet(p1, p2) ;
        System.out.println("personSet >>: " + JSONUtil.toJsonStr(personSet));

        // 对于自定义的类型，如果要实现 Comparable，请记得 equals、hashCode、compareTo 三者逻辑一致。
        List<Person> personList = CollUtil.newArrayList(p1, p2) ;
        Person p3 = Person.builder().id("1001").name("who are you").build() ;
        System.out.println("personList >>: " + personList.indexOf(p3));
        System.out.println("personList >>: " + personList.contains(p3));
        System.out.println("personList >>: " + Collections.binarySearch(personList, p3)); // 这里注意对象的比较

        // 说明 @EqualsAndHashCode 默认实现没有使用父类属性。需要手动设置 callSuper 开关为 true，来覆盖这种默认行为
        Student stu1 = new Student() ;
        stu1.setStuId("A001");
        stu1.setId("1001");
        stu1.setName("张三");
        Student stu2 = new Student();
        stu2.setStuId("A001");
        stu2.setId("1002");
        stu2.setName("李四");

        System.out.println("stu1.equals(stu2) >>: " + stu1.equals(stu2));
    }
}
